package test;

// 导入需要使用的模型类
import model.Course;
import model.Student;
import model.Teacher;

/**
 * 学生选课模拟系统主程序
 * 该类演示了学生选课系统的完整流程，包括：
 * 1. 创建课程和教师
 * 2. 分配教师授课
 * 3. 创建学生并进行选课和退课操作
 * 4. 打印教师工作表和学生课表
 */
public class Main {
    /**
     * 主方法 - 程序入口
     * @param args 命令行参数（本程序未使用）
     */
    public static void main(String[] args) {
        // 打印系统标题
        System.out.println("===== 学生选课模拟系统 =====");
        
        // 第一阶段：创建课程对象
        // 使用Course类的构造方法创建3门不同的课程，设置课程ID、名称、地点、时间和学分
        Course math = new Course("C001", "高等数学", "一号教学楼101", "周一、周三 10:00-12:00", 3);
        Course physics = new Course("C002", "大学物理", "二号教学楼202", "周二、周四 14:00-16:00", 2);
        Course java = new Course("C003", "Java程序设计", "计算机楼303", "周一至周五 08:00-09:40", 4);
        
        // 第二阶段：创建教师对象
        // 使用Teacher类的构造方法创建3位不同的教师，设置教师ID、姓名和性别
        Teacher teacher1 = new Teacher("T001", "张教授", "男");
        Teacher teacher2 = new Teacher("T002", "李老师", "女");
        Teacher teacher3 = new Teacher("T003", "王讲师", "男");
        
        // 第三阶段：分配教师授课
        System.out.println("\n----- 教师授课 -----");
        // 调用教师对象的teachCourse方法，为教师分配课程
        teacher1.teachCourse(math);     // 张教授教授高等数学
        teacher2.teachCourse(physics);  // 李老师教授大学物理
        teacher3.teachCourse(java);     // 王讲师教授Java程序设计
        
        // 第四阶段：打印教师工作表
        System.out.println("\n----- 打印教师信息及所授课程 -----");
        // 调用教师对象的printWorksheet方法，显示教师信息和所授课程
        teacher1.printWorksheet();  // 打印张教授的工作表
        teacher2.printWorksheet();  // 打印李老师的工作表
        teacher3.printWorksheet();  // 打印王讲师的工作表
        
        // 第五阶段：创建学生对象
        // 使用Student类的构造方法创建4位不同的学生，设置学生ID、姓名和性别
        Student student1 = new Student("S001", "张三", "男");
        Student student2 = new Student("S002", "李四", "女");
        Student student3 = new Student("S003", "王五", "男");
        Student student4 = new Student("S004", "赵六", "女");
        
        // 第六阶段：学生选课
        System.out.println("\n----- 学生选课 -----");
        // 调用学生对象的selectCourse方法，让学生选择课程
        student1.selectCourse(math);   // 张三选高等数学
        student1.selectCourse(java);   // 张三选Java程序设计
        student2.selectCourse(math);   // 李四选高等数学
        student2.selectCourse(physics); // 李四选大学物理
        student3.selectCourse(physics); // 王五选大学物理
        student3.selectCourse(java);   // 王五选Java程序设计
        student4.selectCourse(math);   // 赵六选高等数学
        student4.selectCourse(java);   // 赵六选Java程序设计
        
        // 第七阶段：学生退课和重复选课测试
        System.out.println("\n----- 学生退课 -----");
        // 调用学生对象的dropCourse方法，让学生退选课程
        student2.dropCourse(math);     // 李四退选高等数学
        student4.selectCourse(math);   // 赵六重复选高等数学（应该提示已选）
        
        // 第八阶段：打印学生课表
        System.out.println("\n----- 打印学生课表 -----");
        // 调用学生对象的printWorksheet方法，显示学生信息和已选课程
        student1.printWorksheet();  // 打印张三的课表
        student2.printWorksheet();  // 打印李四的课表
        student3.printWorksheet();  // 打印王五的课表
        student4.printWorksheet();  // 打印赵六的课表
        
        // 程序结束
        System.out.println("\n===== 系统运行结束 =====");
    }
}